package com.lncg.task;

import com.lncg.service.impl.TcpConnectionServiceImpl;
import io.netty.channel.ChannelHandlerContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 连接清理定时任务
 * 
 * 定期检查并清理无效的TCP连接，防止连接泄漏。
 * 主要功能：
 * 1. 定期检查所有连接的健康状态
 * 2. 移除已断开或无效的连接
 * 3. 记录连接清理统计信息
 * 
 * @author LNCG
 * @version 1.0.0
 * @since 2024-10-19
 */
@Component
public class ConnectionCleanupTask {
    
    private static final Logger logger = LoggerFactory.getLogger(ConnectionCleanupTask.class);
    
    @Autowired
    private TcpConnectionServiceImpl tcpConnectionService;
    
    /**
     * 定期清理无效连接
     * 每2分钟执行一次连接清理（高并发场景下更频繁）
     */
    @Scheduled(fixedRate = 120000)
    public void cleanupInactiveConnections() {
        try {
            // 获取所有连接并检查是否仍然活跃
            Map<String, ChannelHandlerContext> connections = tcpConnectionService.getAllConnections();
            int cleanedCount = 0;
            int activeCount = 0;
            
            for (Map.Entry<String, ChannelHandlerContext> entry : connections.entrySet()) {
                String clientKey = entry.getKey();
                ChannelHandlerContext ctx = entry.getValue();
                
                if (ctx == null || !ctx.channel().isActive()) {
                    tcpConnectionService.removeConnection(clientKey);
                    cleanedCount++;
                    logger.debug("清理无效连接: {}", clientKey);
                } else {
                    activeCount++;
                }
            }
            
            if (cleanedCount > 0) {
                logger.info("连接清理完成，清理了 {} 个无效连接，当前活跃连接数: {}", 
                    cleanedCount, activeCount);
            } else {
                // 总是输出健康检查信息，确认任务正常运行
                logger.info("连接健康检查完成，当前活跃连接数: {}", activeCount);
            }
            
        } catch (Exception e) {
            logger.error("连接清理任务执行失败: {}", e.getMessage(), e);
        }
    }
    
    /**
     * 连接统计报告
     * 每5分钟输出一次连接统计信息（高并发场景下更频繁监控）
     */
    @Scheduled(fixedRate = 300000)
    public void connectionStatisticsReport() {
        try {
            int totalConnections = tcpConnectionService.getConnectionCount();
            // 总是输出统计信息，包括连接数为0的情况
            logger.info("TCP连接统计 - 当前总连接数: {}", totalConnections);
        } catch (Exception e) {
            logger.error("连接统计报告生成失败: {}", e.getMessage(), e);
        }
    }
}
